package com.money.tracker.generator;

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * MyBatis-plus 新版代码生成器
 * <p>
 *
 * @author zhangshuai
 * &#064;@date 2024/09/27
 */
@Component
public class MyBatisPlusGeneratorService {

    @Resource
    private DynamicDataSourceProperties dataSourceConfig;

    /**
     * 代码生成
     *
     * @param author      作者
     * @param packageName 包名
     * @param moduleName  模块名
     * @param tableName   表名 ---> 生成所有的话，输入@all，其他的用逗号分隔
     */

    public void generate(String author, String packageName, String moduleName, String tableName) {
        // 拿当前数据源配置
        String peek = DynamicDataSourceContextHolder.peek();
        // 没有的话，取主数据源
        if (StringUtils.isBlank(peek)) {
            peek = dataSourceConfig.getPrimary();
        }
        Map<String, DataSourceProperty> datasource = dataSourceConfig.getDatasource();
        DataSourceProperty dataSourceConfig = datasource.get(peek);
        String url = dataSourceConfig.getUrl();
        String username = dataSourceConfig.getUsername();
        String password = dataSourceConfig.getPassword();
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author(author) // 设置作者
                            // .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent(packageName) // 设置父包名
                            .moduleName(moduleName) // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + moduleName)); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude(getTables(tableName)) // 设置需要生成的表名
                            // .addTablePrefix("p_")
                            .serviceBuilder()
                            .formatServiceImplFileName("%sServiceImpl")
                            .entityBuilder()
                            .enableLombok()
                            .enableChainModel()
                            // .logicDeleteColumnName("deleted")
                            .enableTableFieldAnnotation()
                            .controllerBuilder()
                            // 映射路径使用连字符格式，而不是驼峰
                            .enableHyphenStyle()
                            // .formatFileName("%sController")
                            .enableRestStyle()
                            .mapperBuilder()
                            // 生成通用的resultMap
                            .enableBaseResultMap()
                            .superClass(BaseMapper.class);
                    // .formatMapperFileName("%sMapper")
                    // .enableMapperAnnotation();
                    // .formatXmlFileName("%sMapper");

                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();

    }

    /**
     * 请输入表名，多个英文逗号分隔？所有输入 all
     *
     * @param tables
     * @return
     */
    protected List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

}
